package cn.bearspark.article.provider.dao.mapper;

import cn.bearspark.article.provider.dao.co.CategoryCO;
import cn.bearspark.article.provider.dao.po.category.CategoryPO;
import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

/**
 * 专栏分类的数据映射接口
 *
 * @author f
 */
@Mapper
public interface CategoryMapper extends RedisHashMapper<CategoryCO> {

    /**
     * 添加一个专栏分类
     *
     * @param categoryPO 待添加专栏分类的数据对象
     */
    void insert(CategoryPO categoryPO);

    /**
     * 修改一个专栏分类
     *
     * @param categoryPO 待修改专栏分类的数据对象
     * @return 修改操作影响的行数
     */
    int update(CategoryPO categoryPO);

    /**
     * 删除一个专栏分类
     *
     * @param categoryId 待删除的专栏分类 id
     * @param userId     删除专栏分类的用户 id
     * @return 删除操作影响的行数
     */
    @Delete("DELETE FROM t_category WHERE category_id = #{categoryId} AND user_id = #{userId}")
    int delete(long categoryId, long userId);

    /**
     * 查询指定专栏分类对象的热数据
     *
     * @param categoryIdSet 指定的专栏分类对象的 id Set
     * @return 指定专栏分类对象的热数据集合
     */
    @Override
    List<CategoryCO> listHotData(Set<Long> categoryIdSet);

    /**
     * 查询指定专栏分类对象的数据
     *
     * @param categoryIdList 指定的专栏分类对象的 id Set
     * @return 指定专栏分类对象的数据集合
     */
    @Override
    List<CategoryCO> listData(List<Long> categoryIdList);

    /**
     * 获取指定用户创建的所有专栏分类
     * <p>
     * 按照分类的公开专栏数量倒序排序
     *
     * @param listedUserId 待获取所有专栏分类的用户 id
     * @return 指定用户创建的所有专栏分类
     */
    @Select("SELECT category_id FROM t_category WHERE user_id = #{listedUserId} " +
            "ORDER BY public_article_num DESC")
    List<Long> listCategoryId(long listedUserId);

    /**
     * 统计指定用户创建的专栏分类数
     *
     * @param userId 指定的用户 id
     * @return 指定用户创建的专栏分类数
     */
    @Select("SELECT COUNT(*) FROM t_category WHERE user_id = #{userId}")
    long countCategoryNum(long userId);

    /**
     * 增加分类的 全部专栏数 和 公开专栏数
     *
     * @param categoryIdList 待增加分类的 id 集合
     */
    void incrAllAndPublicArticleNum(List<Long> categoryIdList);

    /**
     * 增加分类的 公开专栏数
     *
     * @param categoryIdList 待增加分类的 id 集合
     */
    void incrPublicArticleNum(List<Long> categoryIdList);

    /**
     * 减少分类的 全部专栏数 和 公开专栏数
     *
     * @param categoryIdList 待增加分类的 id 集合
     */
    void decrAllAndPublicArticleNum(List<Long> categoryIdList);

    /**
     * 减少分类的 公开专栏数
     *
     * @param categoryIdList 待增加分类的 id 集合
     */
    void decrPublicArticleNum(List<Long> categoryIdList);
}
